package com.jprocms.module.cms.service.sitetpl;

import com.jpro.framework.common.exception.ServerException;
import com.jprocms.module.cms.controller.admin.sitetpl.dto.TplReSourceDto;
import com.jprocms.module.cms.controller.admin.sitetpl.dto.TplSaveDirDto;
import com.jprocms.module.cms.dal.dataobject.site.SiteDO;
import com.jprocms.module.cms.framework.file.Zipper;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @author jprocms
 */
public interface TplService {
    /**
     * 初始化配置
     */
    void initLocalCache();

    /**
     * 获得下级模板列表。根据路径，用于展现下级目录和文件。
     *
     * @param path 路径
     * @return list
     * @throws ServerException 异常
     */
    List<IResFile> getChild(String path) throws ServerException, IOException;

    /**
     * 获得子文件列表
     *
     * @param path           父文件夹路径
     * @param dirAndEditable 是否只获取文件夹和可编辑文件
     * @param site           站点
     * @return List
     */
    List<IResFile> listFile(String path, boolean dirAndEditable) throws IOException, ServerException;

    /**
     * 保存文件夹
     *
     * @param dto TplSaveDirDto
     * @throws ServerException 异常
     */
    void saveDir(TplSaveDirDto dto) throws ServerException, IOException;

    /**
     * 保存模板
     *
     * @param dto 模板Dto
     * @throws ServerException 异常
     */
    void saveFile(TplReSourceDto dto) throws ServerException, IOException;

    /**
     * 保存模板
     *
     * @param path    路径
     * @param file    文件
     * @param isCover true 替换 false 保留
     * @throws ServerException 异常
     */
    void uploadTplResFile(String path, MultipartFile file, Boolean isCover) throws ServerException, IOException;

    /**
     * 获得模板
     *
     * @param name 模板
     * @return Tpl
     * @throws ServerException 异常
     */
    IResFile get(String name) throws ServerException, IOException;

    /**
     * 修改模板
     *
     * @param dto 模板Dto
     * @throws ServerException 异常
     */
    void update(TplReSourceDto dto) throws Exception;

    /**
     * 修改模板名称或路径
     *
     * @param orig 原路径
     * @param dist 新路径
     * @throws ServerException 异常
     */
    void rename(String orig, String dist) throws ServerException;

    /**
     * 删除模板
     *
     * @param names 模板名称数组 相对路径
     * @throws ServerException 异常
     */
    void delete(String[] names) throws Exception;


    /**
     * 导出模板
     *
     * @param solution 方案名
     * @return List
     * @throws ServerException 异常
     */
    List<Zipper.FileEntry> export(SiteDO site, String solution) throws ServerException;

    /**
     * 导入模板
     *
     * @param file    文件
     * @param isCover 是否覆盖 true 覆盖 false 保存
     * @throws IOException     IO异常
     * @throws ServerException 异常
     */
    void importZip(SiteDO site, File file, Boolean isCover) throws Exception;

    /**
     * 拷贝模板及资源
     *
     * @param from 源站点
     * @param to   目标站点
     * @throws IOException IO异常
     */
    void copySiteTplAndRes(SiteDO from, SiteDO to) throws IOException;


}
